home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / mui / MadMatrixsrc.lha / MadMatrix.src / madmatrix.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-04-23  |  18.4 KB  |  660 lines

  1. #include "madmatrix.h"
  2.  
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <math.h>
  8. #include <time.h>
  9.  
  10. #include <libraries/mui.h>
  11. #include <clib/muimaster_protos.h>
  12.  
  13. #include <proto/utility.h>
  14.  
  15.  
  16. #include "alloctab.h"
  17.  
  18. // Custom class MUI
  19.  
  20. #define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
  21.  
  22. #define PAS 0.12
  23. #define MADMATRIX_ABS(x) ((x)>0?(x):-(x))
  24.  
  25. #define MADMATRIX_LIGNE(taille,nombre) (int)((nombre-1)/taille)
  26. #define MADMATRIX_COLONNE(taille,nombre) (int)((nombre-1)%taille)
  27. #define MADMATRIX_NOMBRE(taille,ligne,colonne) ( taille*ligne+colonne+1 )
  28. #define MADMATRIX_VOISINS(taille,nb1, nb2) \
  29.       ((MADMATRIX_ABS(MADMATRIX_LIGNE(taille,nb1)-MADMATRIX_LIGNE(taille,nb2))+\
  30.       MADMATRIX_ABS(MADMATRIX_COLONNE(taille,nb1)-MADMATRIX_COLONNE(taille,nb2)) ) == 1?1:0)
  31.  
  32. #define MADMATRIX_YOUWIN    "You win"
  33. #define MADMATRIX_GOODLUCK  "Good luck"
  34.  
  35. void Madmatrix_Rotate(struct IClass *cl,Object *obj, int sens, double pas);
  36. void Madmatrix_Shake(struct IClass *cl,Object *obj, int nb);
  37. void Madmatrix_Init(struct Madmatrix_Data *data);
  38. void Madmatrix_Restart(struct IClass *cl,Object *obj);
  39. void Madmatrix_Tourne(int **tableau,int ligne, int colonne, int sens );
  40. int Madmatrix_Calcul(int **tableau, int taille);
  41.  
  42.  
  43. ULONG Madmatrix_Dispose(struct IClass *cl,Object *obj,Msg msg);
  44. ULONG Madmatrix_New(struct IClass *cl,Object *obj,Msg msg);
  45. ULONG Madmatrix_AskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg);
  46. ULONG Madmatrix_Draw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg);
  47. ULONG Madmatrix_Setup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg);
  48. ULONG Madmatrix_Cleanup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg);
  49. ULONG Madmatrix_HandleInput(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg);
  50.  
  51.  
  52. extern struct GfxBase *GfxBase;
  53. extern struct IntuitionBase *IntuitionBase;
  54. extern struct Library  *MUIMasterBase;
  55.  
  56.  
  57.  
  58. #define _between(a,x,b) ((x)>=(a) && (x)<=(b))
  59. #define _isinobject(x,y) (_between(_mleft(obj),(x),_mright (obj)) && _between(_mtop(obj) ,(y),_mbottom(obj)))
  60.  
  61. #define MADMATRIX_MAX(a,b) ((a)<(b)?(b):(a))
  62.  
  63. /// ULONG Madmatrix_New(struct IClass *cl,Object *obj,Msg msg)
  64. ULONG Madmatrix_New(struct IClass *cl,Object *obj,Msg msg)
  65. {
  66.   struct Madmatrix_Data *data;
  67. /*  struct TagItem *tags,*tag;*/
  68.  
  69.   if (!(obj = (Object *)DoSuperMethodA(cl,obj,msg)))
  70.           return(0);
  71.  
  72.   data = INST_DATA(cl,obj);
  73.  
  74.   data->taille = MADMATRIX_TAILLE_MAX;
  75.   data->ntaille = MADMATRIX_TAILLE_MAX;
  76.   data->groupe = NULL;
  77.  
  78.   data->matrice=(int **)AllocTab(sizeof(int),data->taille,data->taille);
  79.  
  80.   Madmatrix_Init(data);
  81.  
  82.   if ( data->matrice == NULL )
  83.     return(FALSE);
  84.  
  85.  
  86.  
  87.  
  88.   /* parse initial taglist */
  89.   /*
  90.   for (tags=((struct opSet *)msg)->ops_AttrList;tag=NextTagItem(&tags);)
  91.   {
  92.           switch (tag->ti_Tag)
  93.           {
  94.                   case MYATTR_PEN:
  95.                           if (tag->ti_Data)
  96.                                   data->penspec = *((struct MUI_PenSpec *)tag->ti_Data);
  97.                           break;
  98.           }
  99.   }
  100.   */
  101.  
  102.   return((ULONG)obj);
  103.  
  104.  
  105. }
  106. ///
  107.  
  108. /// ULONG Madmatrix_Dispose(struct IClass *cl,Object *obj,Msg msg)
  109. ULONG Madmatrix_Dispose(struct IClass *cl,Object *obj,Msg msg)
  110. {
  111.   struct Madmatrix_Data *data = (struct Madmatrix_Data *)INST_DATA(cl,obj);
  112.  
  113.   FreeTab((void **)data->matrice,data->taille);
  114.  
  115.   return(DoSuperMethodA(cl,obj,msg));
  116. }
  117. ///
  118.  
  119. /// ULONG Madmatrix_AskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg)
  120. ULONG Madmatrix_AskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg)
  121. {
  122.   struct Madmatrix_Data *data = (struct Madmatrix_Data *)INST_DATA(cl,obj);
  123.   int largeur;
  124.  
  125.  
  126.   data->font_sx = _font(obj)->tf_XSize;
  127.   data->font_sy = _font(obj)->tf_YSize;
  128.  
  129.   /*printf("Ask %p %d %d\n",_font(obj),_font(obj)->tf_XSize,_font(obj)->tf_YSize);*/
  130.  
  131.   DoSuperMethodA(cl,obj,(Msg)msg);
  132.  
  133.   largeur = (3*data->taille*data->font_sx+1);
  134.  
  135. /*
  136.   printf("%p\n",_rp(obj));
  137.  
  138.   printf("Largeur1 = %d\n",largeur);
  139.   largeur = MADMATRIX_MAX(largeur,TextLength(_rp(obj),MADMATRIX_YOUWIN,strlen(MADMATRIX_YOUWIN)));
  140.   printf("Largeur2 = %d\n",largeur);
  141.   largeur = MADMATRIX_MAX(largeur,TextLength(_rp(obj),MADMATRIX_GOODLUCK,strlen(MADMATRIX_GOODLUCK)));
  142.   printf("Largeur3 = %d\n",largeur);
  143. */
  144.   largeur = MADMATRIX_MAX(largeur,data->font_sx*strlen(MADMATRIX_YOUWIN));
  145.   largeur = MADMATRIX_MAX(largeur,data->font_sx*strlen(MADMATRIX_GOODLUCK));
  146.  
  147.   msg->MinMaxInfo->MinWidth += largeur;
  148.   msg->MinMaxInfo->DefWidth += largeur;
  149.   msg->MinMaxInfo->MaxWidth += largeur;
  150.  
  151.   msg->MinMaxInfo->MinHeight += (2*(data->taille+2)*data->font_sy); /**/
  152.   msg->MinMaxInfo->DefHeight += (2*(data->taille+2)*data->font_sy);
  153.   msg->MinMaxInfo->MaxHeight += (2*(data->taille+2)*data->font_sy);
  154.  
  155.  
  156.   return(0);
  157.  
  158.  
  159. }
  160. ///
  161.  
  162. /// ULONG Madmatrix_Draw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg)
  163. ULONG Madmatrix_Draw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg)
  164. {
  165.   struct Madmatrix_Data *data = (struct Madmatrix_Data *)INST_DATA(cl,obj);
  166.   int ligne,colonne;
  167.   char temp[1000];
  168.   int tf_x=_rp(obj)->Font->tf_XSize;
  169.   int tf_y=_rp(obj)->Font->tf_YSize;
  170.   int offset_x, offset_y, x,y;
  171.  
  172.  
  173.   /* clear message zone */
  174.  
  175.   SetAPen(_rp(obj),0);
  176.   RectFill(_rp(obj),_mleft(obj),_mtop(obj)+(2*tf_y)*(data->taille)+1,_mright(obj),_mbottom(obj));
  177.  
  178.   if ( data->message )
  179.   {
  180.     SetAPen(_rp(obj),1);
  181.     x = _mleft(obj)+1;
  182.     y = _mtop(obj)+(2*tf_y)*(data->taille+1);
  183.  
  184.     Move(_rp(obj),x,y);
  185.     Text(_rp(obj),data->message,strlen(data->message));
  186.  
  187.     data->message=NULL;
  188.   }
  189.  
  190.   if ( data->box == -1 )
  191.   {
  192.     data->box=0;
  193.     SetAPen(_rp(obj),0);
  194.     Move(_rp(obj),_mleft(obj)+(3*tf_x)*data->colonne,_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2);
  195.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*(data->colonne+2),_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2);
  196.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*(data->colonne+2),_mtop(obj)+(2*tf_y)*(data->ligne+2)+tf_x/2);
  197.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*data->colonne,_mtop(obj)+(2*tf_y)*(data->ligne+2)+tf_x/2);
  198.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*data->colonne,_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2);
  199.     return(TRUE);
  200.   }
  201.  
  202.   if ( data->box == 1 )
  203.   {
  204.     data->box=0;
  205.     SetAPen(_rp(obj),1);
  206.     Move(_rp(obj),_mleft(obj)+(3*tf_x)*data->colonne,_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2);
  207.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*(data->colonne+2),_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2);
  208.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*(data->colonne+2),_mtop(obj)+(2*tf_y)*(data->ligne+2)+tf_x/2);
  209.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*data->colonne,_mtop(obj)+(2*tf_y)*(data->ligne+2)+tf_x/2);
  210.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*data->colonne,_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2);
  211.     return(TRUE);
  212.   }
  213.  
  214.  
  215.   DoSuperMethodA(cl,obj,(Msg)msg);
  216.  
  217.   SetAPen(_rp(obj),0);
  218.   if ( data->mouvement == 0 )
  219.     RectFill(_rp(obj),_mleft(obj),_mtop(obj),_mright(obj),_mbottom(obj));
  220.   else
  221.     RectFill(_rp(obj),
  222.               _mleft(obj)+(3*tf_x)*data->colonne+1,_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2+1,
  223.               _mleft(obj)+(3*tf_x)*(data->colonne+2)-1,_mtop(obj)+(2*tf_y)*(data->ligne+2)+tf_x/2-1
  224.             );
  225.  
  226.  
  227.   SetAPen(_rp(obj),1);
  228.  
  229.  
  230.   offset_x = (3*tf_x)*data->pas;
  231.   offset_y = (2*tf_y)*data->pas;
  232.  
  233.   switch ( data->mouvement )
  234.   {
  235.     case 1:
  236.  
  237.       ligne = data->ligne; colonne = data->colonne;
  238.       x = _mleft(obj)+(3*tf_x)*colonne;  y = _mtop(obj)+(2*tf_y)*(ligne+1);
  239.       sprintf(temp,"%3d",data->matrice[ligne][colonne]);
  240.  
  241.       Move(_rp(obj),x+offset_x,y); Text(_rp(obj),temp,strlen(temp));
  242.  
  243.       colonne++;
  244.       x = _mleft(obj)+(3*tf_x)*colonne;  y = _mtop(obj)+(2*tf_y)*(ligne+1);
  245.       sprintf(temp,"%3d",data->matrice[ligne][colonne]);
  246.  
  247.       Move(_rp(obj),x,y+offset_y); Text(_rp(obj),temp,strlen(temp));
  248.  
  249.       ligne++;
  250.       x = _mleft(obj)+(3*tf_x)*colonne;  y = _mtop(obj)+(2*tf_y)*(ligne+1);
  251.       sprintf(temp,"%3d",data->matrice[ligne][colonne]);
  252.  
  253.       Move(_rp(obj),x-offset_x,y); Text(_rp(obj),temp,strlen(temp));
  254.  
  255.       colonne--;
  256.       x = _mleft(obj)+(3*tf_x)*colonne;  y = _mtop(obj)+(2*tf_y)*(ligne+1);
  257.       sprintf(temp,"%3d",data->matrice[ligne][colonne]);
  258.  
  259.       Move(_rp(obj),x,y-offset_y); Text(_rp(obj),temp,strlen(temp));
  260.  
  261.       break;
  262.  
  263.     case -1:
  264.  
  265.       ligne = data->ligne; colonne = data->colonne;
  266.       x = _mleft(obj)+(3*tf_x)*colonne;  y = _mtop(obj)+(2*tf_y)*(ligne+1);
  267.       sprintf(temp,"%3d",data->matrice[ligne][colonne]);
  268.       Move(_rp(obj),x,y+offset_y); Text(_rp(obj),temp,strlen(temp));
  269.  
  270.  
  271.       colonne++;
  272.       x = _mleft(obj)+(3*tf_x)*colonne;  y = _mtop(obj)+(2*tf_y)*(ligne+1);
  273.       sprintf(temp,"%3d",data->matrice[ligne][colonne]);
  274.  
  275.       Move(_rp(obj),x-offset_x,y); Text(_rp(obj),temp,strlen(temp));
  276.  
  277.       ligne++;
  278.       x = _mleft(obj)+(3*tf_x)*colonne;  y = _mtop(obj)+(2*tf_y)*(ligne+1);
  279.       sprintf(temp,"%3d",data->matrice[ligne][colonne]);
  280.  
  281.       Move(_rp(obj),x,y-offset_y); Text(_rp(obj),temp,strlen(temp));
  282.  
  283.       colonne--;
  284.       x = _mleft(obj)+(3*tf_x)*colonne;  y = _mtop(obj)+(2*tf_y)*(ligne+1);
  285.       sprintf(temp,"%3d",data->matrice[ligne][colonne]);
  286.  
  287.       Move(_rp(obj),x+offset_x,y); Text(_rp(obj),temp,strlen(temp));
  288.  
  289.       break;
  290.  
  291.     default :
  292.       for ( ligne=0;ligne<data->taille; ligne++)
  293.       {
  294.         for ( colonne=0;colonne<data->taille; colonne++ )
  295.         {
  296.           x = _mleft(obj)+(3*tf_x)*colonne;
  297.           y = _mtop(obj)+(2*tf_y)*(ligne+1);
  298.           sprintf(temp,"%3d",data->matrice[ligne][colonne]);
  299.  
  300.           Move(_rp(obj),x,y);
  301.           Text(_rp(obj),temp,strlen(temp));
  302.  
  303.         }
  304.       }
  305.       break;
  306.   }
  307.  
  308.  
  309.  
  310.  
  311.   if ( ! data->shaking )
  312.   {
  313.     Move(_rp(obj),_mleft(obj)+(3*tf_x)*data->colonne,_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2);
  314.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*(data->colonne+2),_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2);
  315.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*(data->colonne+2),_mtop(obj)+(2*tf_y)*(data->ligne+2)+tf_x/2);
  316.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*data->colonne,_mtop(obj)+(2*tf_y)*(data->ligne+2)+tf_x/2);
  317.     Draw(_rp(obj),_mleft(obj)+(3*tf_x)*data->colonne,_mtop(obj)+(2*tf_y)*(data->ligne+1)-3*tf_x/2);
  318.   }
  319.  
  320.  
  321.   return(TRUE);
  322.  
  323. }
  324. ///
  325.  
  326. /// ULONG Madmatrix_Setup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  327. /* init data & allocate pens */
  328. ULONG Madmatrix_Setup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  329. {
  330.   if (!(DoSuperMethodA(cl,obj,(Msg)msg)))
  331.     return(FALSE);
  332.  
  333.   MUI_RequestIDCMP(obj,IDCMP_RAWKEY);
  334.  
  335.   srand(time(NULL));
  336.  
  337.   return(TRUE);
  338. }
  339. ///
  340.  
  341.  
  342. /// ULONG Madmatrix_Set(struct IClass *cl,Object *obj,Msg msg)
  343. ULONG Madmatrix_Set(struct IClass *cl,Object *obj,Msg msg)
  344. {
  345.   struct Madmatrix_Data *data = INST_DATA(cl,obj);
  346.   struct TagItem *tags,*tag;
  347.  
  348.   for (tags=((struct opSet *)msg)->ops_AttrList;(tag=NextTagItem(&tags));)
  349.   {
  350.  
  351.     switch (tag->ti_Tag)
  352.     {
  353.       case MADMATRIX_TAILLE:
  354.         data->ntaille=tag->ti_Data;
  355.         break;
  356.       case MADMATRIX_GROUPE:
  357.         data->groupe=(Object *)tag->ti_Data;
  358.         break;
  359.  
  360.     }
  361.   }
  362.   return(DoSuperMethodA(cl,obj,msg));
  363. }
  364. ///
  365.  
  366. /// ULONG Madmatrix_Get(struct IClass *cl,Object *obj,Msg msg)
  367. ULONG Madmatrix_Get(struct IClass *cl,Object *obj,Msg msg)
  368. {
  369.   struct Madmatrix_Data *data = INST_DATA(cl,obj);
  370.   ULONG *store = ((struct opGet *)msg)->opg_Storage;
  371.  
  372.   switch (((struct opGet *)msg)->opg_AttrID)
  373.   {
  374.     case MADMATRIX_TAILLE:
  375.       *store = (ULONG)(data->taille);
  376.       return(TRUE);
  377.   }
  378.  
  379.   return(DoSuperMethodA(cl,obj,msg));
  380. }
  381. ///
  382.  
  383. /// ULONG Madmatrix_HandleInput(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  384. ULONG Madmatrix_HandleInput(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  385. {
  386.   struct Madmatrix_Data *data = (struct Madmatrix_Data *)INST_DATA(cl,obj);
  387.  
  388.   if (msg->muikey!=MUIKEY_NONE)
  389.   {
  390.     switch (msg->muikey)
  391.     {
  392.       case MUIKEY_UP :
  393.         data->box=-1;
  394.         MUI_Redraw(obj,MADF_DRAWUPDATE);
  395.         if ( data->ligne>0 )
  396.           data->ligne--;
  397.         data->box=1;
  398.         MUI_Redraw(obj,MADF_DRAWUPDATE);
  399.         break;
  400.  
  401.       case MUIKEY_DOWN :
  402.         data->box=-1;
  403.         MUI_Redraw(obj,MADF_DRAWUPDATE);
  404.         if ( data->ligne<data->taille-2 )
  405.           data->ligne++;
  406.         data->box=1;
  407.         MUI_Redraw(obj,MADF_DRAWUPDATE);
  408.         break;
  409.  
  410.       case MUIKEY_RIGHT :
  411.         data->box=-1;
  412.         MUI_Redraw(obj,MADF_DRAWUPDATE);
  413.         if ( data->colonne<data->taille-2 )
  414.           data->colonne++;
  415.         data->box=1;
  416.         MUI_Redraw(obj,MADF_DRAWUPDATE);
  417.         break;
  418.  
  419.       case MUIKEY_LEFT :
  420.         data->box=-1;
  421.         MUI_Redraw(obj,MADF_DRAWUPDATE);
  422.         if ( data->colonne>0 )
  423.           data->colonne--;
  424.         data->box=1;
  425.         MUI_Redraw(obj,MADF_DRAWUPDATE);
  426.         break;
  427.  
  428.       case MUIKEY_PRESS :
  429.         Madmatrix_Rotate(cl,obj, -1,PAS);
  430.         /*MUI_Redraw(obj,MADF_DRAWUPDATE);*/
  431.         break;
  432.       case MUIKEY_TOGGLE :
  433.         Madmatrix_Rotate(cl,obj, 1, PAS);
  434.         /*MUI_Redraw(obj,MADF_DRAWUPDATE);*/
  435.         break;
  436.     }
  437.   }
  438.  
  439.   if ( msg->imsg &&  msg->imsg->Class == IDCMP_RAWKEY  )
  440.   {
  441.     if ( msg->imsg->Code ==  24 ) /* 'o' key */
  442.         Madmatrix_Rotate(cl,obj, -1,PAS);
  443.  
  444.     if ( msg->imsg->Code ==  25 ) /* 'p' key */
  445.         Madmatrix_Rotate(cl,obj, 1,PAS);
  446.   }
  447.   return(DoSuperMethodA(cl,obj,(Msg)msg));
  448. }
  449. ///
  450.  
  451. /// ULONG Madmatrix_Cleanup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  452. ULONG Madmatrix_Cleanup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  453. {
  454.   MUI_RejectIDCMP(obj,IDCMP_RAWKEY);
  455.  
  456.   return(DoSuperMethodA(cl,obj,(Msg)msg));
  457. }
  458. ///
  459.  
  460. /// ULONG __attribute__((regparm(3))) Madmatrix_Dispatcher(struct IClass *cl , void *msg,Object *obj  )
  461. ULONG __attribute__((regparm(3))) Madmatrix_Dispatcher(struct IClass *cl , void *msg,Object *obj  )
  462. {
  463.   Msg msg2;
  464.   struct Madmatrix_Data *data;
  465.  
  466.   data = (struct Madmatrix_Data *)INST_DATA(cl,obj);
  467.   msg2= (Msg) msg;
  468.  
  469.   switch (msg2->MethodID)
  470.   {
  471.     case OM_NEW           : return(Madmatrix_New(cl,obj,(APTR)msg));
  472.     case OM_DISPOSE       : return(Madmatrix_Dispose(cl,obj,(APTR)msg));
  473.     case OM_SET           : return(Madmatrix_Set(cl,obj,(APTR)msg));
  474.     case OM_GET           : return(Madmatrix_Get(cl,obj,(APTR)msg));
  475.     case MUIM_AskMinMax   : return(Madmatrix_AskMinMax (cl,obj,(struct MUIP_AskMinMax *)msg));
  476.     case MUIM_Draw        : return(Madmatrix_Draw  (cl,obj,(struct MUIP_Draw *)msg));
  477.     case MUIM_HandleInput : return(Madmatrix_HandleInput(cl,obj,(struct MUIP_HandleInput *)msg));
  478.     case MUIM_Setup       : return(Madmatrix_Setup  (cl,obj,(struct MUIP_HandleInput *)msg));
  479.     case MUIM_Cleanup     : return(Madmatrix_Cleanup (cl,obj,(struct MUIP_HandleInput *)msg));
  480.     case MADMATRIX_SHAKE         :  Madmatrix_Shake(cl,obj,data->taille*data->taille-data->taille+1); return(TRUE);
  481.     case MADMATRIX_RESTART       :  Madmatrix_Restart(cl,obj); return(TRUE);
  482.   }
  483.  
  484.  
  485.  
  486.   return(DoSuperMethodA(cl,obj,(Msg)msg));
  487. }
  488. ///
  489.  
  490.  
  491.  
  492.  
  493.  
  494. /// void Madmatrix_Rotate(struct IClass *cl,Object *obj, int sens, double pas)
  495. /* init data & allocate pens */
  496. void Madmatrix_Rotate(struct IClass *cl,Object *obj, int sens, double pas)
  497. {
  498.   struct Madmatrix_Data *data = (struct Madmatrix_Data *)INST_DATA(cl,obj);
  499.  
  500.   data->mouvement=sens;
  501.   for ( data->pas=0; data->pas <= 1; data->pas+=pas )
  502.   {
  503.     WaitTOF();
  504.     MUI_Redraw(obj,MADF_DRAWUPDATE);
  505.   }
  506.  
  507.   Madmatrix_Tourne(data->matrice, data->ligne, data->colonne, sens);
  508.   if ( data->shaked )
  509.     if ( Madmatrix_Calcul(data->matrice,data->taille) == data->taille*data->taille )
  510.       data->message="You win !";
  511.   Madmatrix_Tourne(data->matrice, data->ligne, data->colonne, -sens);
  512.  
  513.   data->pas=1;
  514.   MUI_Redraw(obj,MADF_DRAWUPDATE);
  515.   data->mouvement=0;
  516.  
  517.   Madmatrix_Tourne(data->matrice, data->ligne, data->colonne, sens);
  518. }
  519. ///
  520.  
  521. /// void Madmatrix_Shake(struct IClass *cl,Object *obj, int nb)
  522. void Madmatrix_Shake(struct IClass *cl,Object *obj, int nb)
  523. {
  524.   struct Madmatrix_Data *data = (struct Madmatrix_Data *)INST_DATA(cl,obj);
  525.   int cpt, sens=-1;
  526.  
  527.   data->box = -1;
  528.   MUI_Redraw(obj,MADF_DRAWUPDATE);
  529.  
  530.   data->shaking=1;
  531.  
  532.   for ( cpt=0; cpt<nb; cpt++ )
  533.   {
  534.     data->ligne   = rand()%(data->taille-1);
  535.     data->colonne = rand()%(data->taille-1);
  536.     sens=-sens;
  537.  
  538.     Madmatrix_Rotate(cl,obj,sens,3*PAS);
  539.  
  540.   }
  541.   data->shaking=0;
  542.   data->shaked=1;
  543.   data->ligne=0;
  544.   data->colonne=0;
  545.  
  546.   data->box = 1;
  547.   data->message=MADMATRIX_GOODLUCK;
  548.   MUI_Redraw(obj,MADF_DRAWUPDATE);
  549.  
  550. }
  551. ///
  552.  
  553. /// void Madmatrix_Init(struct Madmatrix_Data *data)
  554. void Madmatrix_Init(struct Madmatrix_Data *data)
  555. {
  556.   int ligne, colonne,nb=1;
  557.  
  558.   for ( ligne=0; ligne<data->taille; ligne++ )
  559.     for ( colonne=0; colonne<data->taille; colonne++ )
  560.       data->matrice[ligne][colonne]=nb++;
  561.  
  562.   data->ligne   = 0;
  563.   data->colonne = 0;
  564.  
  565.   data->mouvement=0;
  566.   data->shaking=0;
  567.  
  568. }
  569. ///
  570.  
  571. /// void Madmatrix_Restart(struct IClass *cl,Object *obj)
  572. void Madmatrix_Restart(struct IClass *cl,Object *obj)
  573. {
  574.   struct Madmatrix_Data *data = (struct Madmatrix_Data *)INST_DATA(cl,obj);
  575.  
  576.  
  577.   if ( data->ntaille > MADMATRIX_TAILLE_MAX )
  578.     data->ntaille = MADMATRIX_TAILLE_MAX;
  579.  
  580.   if ( data->ntaille < 3 )
  581.     data->ntaille=3;
  582.  
  583.   if ( data->taille != data->ntaille )
  584.   {
  585.     if ( data->groupe )
  586.     {
  587.       if (DoMethod(data->groupe,MUIM_Group_InitChange))
  588.       {
  589.         FreeTab((void **)data->matrice,data->taille);
  590.  
  591.         DoMethod(data->groupe,OM_REMMEMBER,obj);
  592.         data->taille=data->ntaille;
  593.         DoMethod(data->groupe,OM_ADDMEMBER,obj);
  594.  
  595.         DoMethod(data->groupe,MUIM_Group_ExitChange);
  596.       }
  597.     }
  598.     else
  599.     {
  600.       FreeTab((void **)data->matrice,data->taille);
  601.       data->taille=data->ntaille;
  602.     }
  603.  
  604.  
  605.     data->matrice=(int **)AllocTab(sizeof(int),data->taille,data->taille);
  606.   }
  607.  
  608.   Madmatrix_Init(data);
  609.  
  610.   data->shaked = 0;
  611.  
  612.   MUI_Redraw(obj,MADF_DRAWOBJECT);
  613. }
  614. ///
  615.  
  616.  
  617. /// void Madmatrix_Tourne(int **tableau,int ligne, int colonne, int sens )
  618. void Madmatrix_Tourne(int **tableau,int ligne, int colonne, int sens )
  619. {
  620.   int temp=tableau[ligne   ][colonne   ];
  621.  
  622.   if ( sens>=0 )
  623.   {
  624.     tableau[ligne   ][colonne   ]   = tableau[ligne+1 ][colonne   ];
  625.     tableau[ligne+1 ][colonne   ]   = tableau[ligne+1 ][colonne+1 ];
  626.     tableau[ligne+1 ][colonne+1 ]   = tableau[ligne   ][colonne+1 ];
  627.     tableau[ligne   ][colonne+1 ]   = temp;
  628.   }
  629.   else
  630.   {
  631.     tableau[ligne   ][colonne   ]   = tableau[ligne   ][colonne+1 ];
  632.     tableau[ligne   ][colonne+1 ]   = tableau[ligne+1 ][colonne+1 ];
  633.     tableau[ligne+1 ][colonne+1 ]   = tableau[ligne+1 ][colonne   ];
  634.     tableau[ligne+1 ][colonne   ]   = temp;
  635.   }
  636.  
  637.  
  638. }
  639. ///
  640.  
  641.  
  642. /// int Madmatrix_Calcul(int **tableau, int taille)
  643. int Madmatrix_Calcul(int **tableau, int taille)
  644. {
  645.   int ligne, colonne;
  646.   int nb=0;
  647.  
  648.  
  649.   for ( ligne=0; ligne<taille; ligne++ )
  650.     for ( colonne=0; colonne<taille; colonne++ )
  651.     {
  652.       if ( tableau[ligne][colonne] == MADMATRIX_NOMBRE(taille,ligne,colonne) )
  653.         nb++;
  654.     }
  655.  
  656.   return(nb);
  657. }
  658. ///
  659.  
  660.